#include "KEY.h"
#include "main.h"
#include "LedCtrl.h"
#include "tim.h"

// 声明外部全局变量 LEDParameterSET，别名为 LEDParameter
extern LEDParameter LEDParameterSET;

// 定义全局变量 DeviceStatusSET，别名为 DeviceStatus，该类型在 KEY.h 中声明
DeviceStatusSET DeviceStatus;

/**
 * @brief GPIO 外部中断回调函数，处理外部中断事件。
 * 
 * 当 GPIO 引脚触发外部中断时，此函数会被调用。根据不同的 GPIO 引脚编号，
 * 设置不同的按键编号，用于后续的按键功能处理。
 * 
 * @param GPIO_Pin 触发中断的 GPIO 引脚编号。
 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 
{
    // 检查触发中断的引脚是否为 GPIO_PIN_6
    if (GPIO_Pin == Touch1_Pin) {
        // 如果按键编号不为 0，先将其置为 0
        if (DeviceStatus.KeyNum != 0) {
            DeviceStatus.KeyNum = 0;
        }
        // 将按键编号设置为 1，表示按键 1 被按下
        DeviceStatus.KeyNum = 1;
    }
    // 检查触发中断的引脚是否为 GPIO_PIN_7
    if (GPIO_Pin == Touch2_Pin) {
        // 将按键编号设置为 2，表示按键 2 被按下
        DeviceStatus.KeyNum = 2;
    }
}

/**
 * @brief 按键功能函数，处理按键短按、长按及模式切换逻辑。
 * 
 * 该函数根据不同的按键编号执行相应的操作，包括按键短按、长按复位以及模式切换等功能。
 */
void KeyFuntion(void) 
{
    // 按键短按、长按复位逻辑
    if (DeviceStatus.KeyNum == 1) {
        // 消抖延时 50ms，防止误触发
        HAL_Delay(50);
        // 读取按键状态，判断按键是否松开
        if (HAL_GPIO_ReadPin(Touch1_GPIO_Port, Touch1_Pin) == 1 ) {
            // 保持按键编号为 1
            DeviceStatus.KeyNum = 1;
            // 清除错误编号
            DeviceStatus.ERRORNUM = 0;
        } else {
            // 如果设备处于错误状态且电源已开启，清除错误状态和按键编号
            if(DeviceStatus.ERRORNUM == 1 && DeviceStatus.powerState == 1) {
                DeviceStatus.ERRORNUM = 0;
                DeviceStatus.KeyNum = 0;
            }
            // 检测按键长按状态 1000ms（100 * 10ms）
            for (int i = 0; i < 100; i++) {
                HAL_Delay(10);

                // 如果在 1000ms 内按键松开，执行复位切换操作
                if (HAL_GPIO_ReadPin(Touch1_GPIO_Port, Touch1_Pin) == 1 && DeviceStatus.KeyNum == 1 && DeviceStatus.ERRORNUM == 0) {
                    // 如果设备电源已开启，执行复位切换逻辑
									 LEDParameterSET.LEDRATIO=1.0;
                    if (DeviceStatus.powerState == 1) {
                        // 根据当前亮度等级进行复位切换
                        if (DeviceStatus.currentLevel == 1) {
                            // 从最低亮度开始向上切换
                            DeviceStatus.levelDirection = 1; 
                            DeviceStatus.pendingLevel = 2;
                        } else if (DeviceStatus.currentLevel == 2) {
                            // 根据方向切换到上一个或下一个亮度等级
                            DeviceStatus.pendingLevel = (DeviceStatus.levelDirection > 0) ? 3 : 1;
                        } else if (DeviceStatus.pendingLevel == 3) {
                            // 从最高亮度开始向下切换
                            DeviceStatus.pendingLevel = 2;
                            DeviceStatus.levelDirection = -1; 
                        }
                    }
                    // 清除按键编号
                    DeviceStatus.KeyNum = 0;
                    // 跳出循环
                    break;
                } 
            }
            
            // 如果按键长按超过 1000ms 仍未松开
            if (HAL_GPIO_ReadPin(Touch1_GPIO_Port, Touch1_Pin) == 0 && DeviceStatus.KeyNum == 1 && DeviceStatus.ERRORNUM == 0) {
                // 切换设备电源状态
                DeviceStatus.powerState = !DeviceStatus.powerState;
                // 根据电源状态设置待设置的亮度等级
                DeviceStatus.pendingLevel = (DeviceStatus.powerState == 1) ? 1 : 0;
                // 清除按键编号
                DeviceStatus.KeyNum = 0;
							 LEDParameterSET.LEDRATIO=1.0;//语音部分的”亮一点暗一点“指令会保留到后面，所以每次切换都重置比例
            }
        }
    }
    
    // 模式切换逻辑
    else if (DeviceStatus.KeyNum == 2) {
        // 消抖延时 50ms，防止误触发
        HAL_Delay(50);
        // 检查按键是否按下
        if (HAL_GPIO_ReadPin(Touch2_GPIO_Port, Touch2_Pin) == 0&& DeviceStatus.powerState == 1) {
            // 切换待设置的模式
            DeviceStatus.pendingMode = !DeviceStatus.pendingMode;
						DeviceStatus.pendingLevel =1;
					  LEDParameterSET.LEDRATIO=1.0;//语音部分的”亮一点暗一点“指令会保留到后面，所以每次切换都重置比例
        }
        // 清除按键编号
        DeviceStatus.KeyNum = 0;
    }
	
}
